package com.njworkorder.Utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

/**
 * 通用树形结构构建工具
 * 可以将任何包含id和parentId的对象列表转换为树形结构
 */
public class TreeBuilder {

    /**
     * 将列表转换为树形结构
     * @param list 源数据列表
     * @param childrenFieldName 子节点集合的字段名
     * @param <T> 数据类型
     * @return 树形结构列表
     */
    public static <T> List<T> buildTree(List<T> list,String childrenFieldName) {
        if (list == null || list.isEmpty()) {
            return Collections.emptyList();
        }

        try {
            // 获取第一个元素的类型，用于反射
            Class<?> clazz = list.getFirst().getClass();

            // 获取id和parentId的getter方法
            Method getIdMethod = getGetterMethod(clazz, "id");
            Method getParentIdMethod = getGetterMethod(clazz, "parentId");

            // 获取children字段
            Field childrenField = clazz.getDeclaredField(childrenFieldName);
            childrenField.setAccessible(true);

            // 获取children字段的setter方法
            String setterMethodName = "set" + childrenFieldName.substring(0, 1).toUpperCase() + childrenFieldName.substring(1);
            Method setChildrenMethod = clazz.getMethod(setterMethodName, List.class);

            // 使用Map存储所有节点，提高查找效率
            Map<Object, T> nodeMap = new HashMap<>(list.size());
            for (T node : list) {
                Object id = getIdMethod.invoke(node);
                nodeMap.put(id, node);

                // 初始化子节点列表
                setChildrenMethod.invoke(node, new ArrayList<>());
            }

            // 结果列表，用于存储顶层节点
            List<T> rootList = new ArrayList<>();

            // 构建树形结构
            for (T node : list) {
                Object parentId = getParentIdMethod.invoke(node);

                // 如果parentId为null或空，则为顶层节点
                if (parentId == null || "".equals(parentId)) {
                    rootList.add(node);
                } else {
                    // 将当前节点添加到父节点的子节点列表中
                    T parentNode = nodeMap.get(parentId);
                    if (parentNode != null) {
                        @SuppressWarnings("unchecked")
                        List<T> children = (List<T>) childrenField.get(parentNode);
                        children.add(node);
                    } else {
                        // 找不到父节点，作为顶层节点处理
                        rootList.add(node);
                    }
                }
            }

            return rootList;
        } catch (Exception e) {
            throw new RuntimeException("构建树形结构失败!", e);
        }
    }

    /**
     * 获取getter方法
     */
    private static Method getGetterMethod(Class<?> clazz, String fieldName) throws NoSuchMethodException {
        String getterMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        try {
            return clazz.getMethod(getterMethodName);
        } catch (NoSuchMethodException e) {
            // 尝试is开头的getter（用于boolean类型）
            getterMethodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            return clazz.getMethod(getterMethodName);
        }
    }
}